package com.sunflower.common.mybatis.aspect.annotation;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 类描述:  字典注解
 * 作    者： zjh
 * 日    期： 2024年04月7日
 * 注意使用此注解需要父类实现 IDict
 *
 * @author 19326
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Dict {

    /**
     * 方法描述:  是否深入生成字典
     * 此方法为 true 时 其它属性都无效
     * 此方法为 true 时 只能标记在对象上 而非基础类型上 如 String、Integer、Long、Boolean、Double、Float、Byte、Short、Character、Character[]、char[]、byte[]、short[]、int[]、long[]、float[]、double[]、String[]、Integer[]、Long[]、Boolean[]、Double[]、Float[]、Byte[]、Short[]、Character 等
     *
     * @return
     */
    boolean deep() default false;

    /**
     * 方法描述:  数据字典类
     * 要求：必须是实力类对象
     * 因为最终会通过 {@link TableInfoHelper#getTableInfo(Class) } 方法获取
     * 注意这个优先级比下面的 dictTable高
     * 注意如果使用此值 {#link Dict#dictTable() }会被忽视
     * 如果 {#link Dict#dicCode() } 无值则默认使用 {@link TableInfoHelper#getTableInfo(Class)#getKeyColumn() } 也就是表主键 （注意前提是此表必须有主键） 一般情况下默认就好
     * 如果有特殊情况 {#link Dict#dicCode() } 可以进行赋值
     *
     * @return
     */
    Class dictClass() default Void.class;

    /**
     * 方法描述:  数据code
     * 作    者： zjh
     * 日    期： 2024年04月7日
     *
     * @return 返回类型： String
     */
    String dicCode() default "";

    /**
     * 方法描述:  数据Text
     * 作    者： zjh
     * 日    期： 2024年04月7日
     *
     * @return 返回类型： String
     */
    String dicText() default "";

    /**
     * 方法描述: 数据字典表
     * 作    者： zjh
     * 日    期： 2024年04月7日
     *
     * @return 返回类型： String
     */
    String dictTable() default "";

    /**
     * 默认按照逗号分隔
     * 如果不需要分割设置为 “”
     *
     * @return
     */
    String separator() default StrUtil.COMMA;
}
